package dao

//数据库表的增加，删减，查询，验证我们都在这里进行封装定义
import (
	"fmt"
	"gin_wuwen_back/model"
	"gin_wuwen_back/tool"
	"log"
)

type Memberdao struct {
	*tool.Orm //继承orm,有数据库的引擎,
	// 那我们在进行定义的时候我们就要传入一个已经定义好的数据库引擎

}

//我们定义下这个类的一种方法

func (tmp *Memberdao) InsertCode(sms model.SmsCode) int64 {
	/*
	  @Description:插入一条验证码的数据库记录
	  @receiver tmp
	  @param sms 要插入的表结构对象SmsCode
	  @return int64 成功与否的值
	*/

	//确定参数是一个结构体类型，是规定的表结构的结构体
	result, err := tmp.InsertOne(&sms) //调用对象的一个方法，进行数据库的插入，一个orm对象就对应了一个表
	if err != nil {
		panic(err.Error())

	}
	return result

}

func (tmp *Memberdao) InsetMember(member model.Member) int64 {
	/*
	  @Description:插入一条新会员相关的信息
	  @receiver tmp
	  @param member 要插入的表结构对象
	  @return int64
	*/
	result, err := tmp.InsertOne(&member)
	if err != nil {
		fmt.Println(err.Error())
		return 0

	}
	return result

}

func (tmp *Memberdao) VaSmsCode(phone string, code string) *model.SmsCode {
	//
	/**
	 * @Description:我们定义一个函数用于手机号和验证码的验证
	 * @receiver tmp 实例化的对象
	 * @param phone 传入来的手机号
	 * @param code 传入来的验证码
	 * @return *model.SmsCode 返回已经确认的数据对象
	 */
	var sms model.SmsCode
	if _, err := tmp.Where("phone=? and code=?", phone, code).Get(&sms); err != nil {
		fmt.Println(err.Error())

	}
	return &sms

}

func (tmp *Memberdao) QueryByPhone(phone string) *model.Member {
	/*
	  @Description:通过手机号来查询已经注册了的用户
	  @receiver tmp
	  @param phone 查询用的手机号
	  @return *model.Member 查询出来对象的地址
	*/

	var memeber model.Member
	if _, err := tmp.Where("mobile=?", phone).Get(&memeber); err != nil { //这里我们查询我们就要使用model中定义时的json字段
		//&member传地址的原因也是能够直接就在我们定义的对象上进行赋值
		fmt.Println(err.Error())
	}
	return &memeber

}

/*
  @Description: 通过用户名和密码来查询用户并进行返回
  @receiver tmp
  @param name 要查询用户的名称
  @param password 要查询用户的密码
  @return *model.Member 返回查询出来数据库对象的指针类型
*/
func (tmp *Memberdao) QueryLoginByPass(name string, password string) *model.Member {
	var member model.Member

	password = tool.EncoderSha256(password)

	_, err := tmp.Where(" user_name = ? and password = ? ", name, password).Get(&member)
	if err != nil {
		log.Println(err.Error())
		return nil
	}

	return &member

}

/*
  @Description:更新头像属性
  @receiver tmp
  @param id
  @param filname
  @return int64
*/
func (tmp *Memberdao) UpdataMember(id int64, filname string) int64 {
	member := model.Member{Avatar: filname}
	result, err := tmp.Where("id=?", id).Update(&member)
	if err != nil {
		fmt.Println(err.Error())
		return 0

	}
	return result

}

/*
  @Description: 通过id来查询用户的信息
  @receiver tmp
  @param id 要使用查询的id
  @return *model.Member 查询出来返回的对象
*/
func (tmp *Memberdao) QueryMemberById(id int64) *model.Member {
	var member model.Member
	if _, err := tmp.Where("id =?", id).Get(&member); err != nil {
		fmt.Println(err.Error())
		return nil
	}
	return &member

}
